<!DOCTYPE html>



  


<html class="theme-next gemini use-motion" lang="zh-CN">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  
    
      
    

    
  

  
    
      
    

    
  

  
    
      
    

    
  

  
    
      
    

    
  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Microsoft YaHei:300,300italic,400,400italic,700,700italic|Microsoft YaHei:300,300italic,400,400italic,700,700italic|Microsoft YaHei:300,300italic,400,400italic,700,700italic|Microsoft YaHei:300,300italic,400,400italic,700,700italic|Inziu Iosevka Slab SC:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.1.2" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="Hexo, NexT" />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.1.2" />






<meta name="description" content="PyWavelets - Discrete Wavelet Transform in Pythonhttps://pywavelets.readthedocs.io/en/0.2.0/index.html">
<meta property="og:type" content="article">
<meta property="og:title" content="Wavelets in PyWavelets">
<meta property="og:url" content="http://idmk.oschina.io/2018/02/28/Wavelets-in-PyWavelets/index.html">
<meta property="og:site_name" content="苦舟">
<meta property="og:description" content="PyWavelets - Discrete Wavelet Transform in Pythonhttps://pywavelets.readthedocs.io/en/0.2.0/index.html">
<meta property="og:locale" content="zh-CN">
<meta property="og:updated_time" content="2018-02-28T15:55:13.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Wavelets in PyWavelets">
<meta name="twitter:description" content="PyWavelets - Discrete Wavelet Transform in Pythonhttps://pywavelets.readthedocs.io/en/0.2.0/index.html">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    sidebar: {"position":"left","display":"hide","offset":12,"offset_float":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: true,
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://idmk.oschina.io/2018/02/28/Wavelets-in-PyWavelets/"/>





  <title>Wavelets in PyWavelets | 苦舟</title>
  














</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">苦舟</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle">学海无涯，吾将上下求索。</p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      
        
        <li class="menu-item menu-item-commonweal">
          <a href="/404.html" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-heartbeat"></i> <br />
            
            公益404
          </a>
        </li>
      

      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="popup-trigger">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br />
            
            搜索
          </a>
        </li>
      
    </ul>
  

  
    <div class="site-search">
      
  <div class="popup search-popup local-search-popup">
  <div class="local-search-header clearfix">
    <span class="search-icon">
      <i class="fa fa-search"></i>
    </span>
    <span class="popup-btn-close">
      <i class="fa fa-times-circle"></i>
    </span>
    <div class="local-search-input-wrapper">
      <input autocomplete="off"
             placeholder="搜索..." spellcheck="false"
             type="text" id="local-search-input">
    </div>
  </div>
  <div id="local-search-result"></div>
</div>



    </div>
  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://idmk.oschina.io/2018/02/28/Wavelets-in-PyWavelets/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="东木金">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/uploads/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="苦舟">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">Wavelets in PyWavelets</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2018-02-28T23:55:13+08:00">
                2018-02-28
              </time>
            

            

            
          </span>

          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <p>PyWavelets - Discrete Wavelet Transform in Python<br><a href="https://pywavelets.readthedocs.io/en/0.2.0/index.html" target="_blank" rel="external">https://pywavelets.readthedocs.io/en/0.2.0/index.html</a><br><a id="more"></a></p>
<h2 id="Wavelet-Families-and-Built-in-wavelets"><a href="#Wavelet-Families-and-Built-in-wavelets" class="headerlink" title="Wavelet Families and Built-in wavelets"></a>Wavelet Families and Built-in wavelets</h2><p>Currently the built-in families are:</p>
<ul>
<li>Haar (haar)</li>
<li>Daubechies (db)</li>
<li>Symlets (sym)</li>
<li>Coiflets (coif)</li>
<li>Biorthogonal (bior)</li>
<li>Reverse biorthogonal (rbio)</li>
<li>“ Discrete ” FIR approximation of Meyer wavelet (dmey)</li>
</ul>
<p><code>pywt.wavelist([family])</code><br>The wavelist() function returns a list of names of the built-in wavelets.<br>If the family name is None then names of all the built-in wavelets are returned. Otherwise the function returns names of wavelets that belong to the given family.</p>
<h2 id="Wavelet-object"><a href="#Wavelet-object" class="headerlink" title="Wavelet object"></a>Wavelet object</h2><p><code>class pywt.Wavelet(name[, filter_bank=None])</code><br>Parameters:</p>
<ul>
<li>name – Wavelet name</li>
<li>filter_bank – Use a user supplied filter bank instead of a built-in Wavelet.<br>  The filter bank object can be a list of four filters coefficients or an object with filter_bank attribute, which returns a list of such filters in the following order:<pre><code>[dec_lo, dec_hi, rec_lo, rec_hi]
</code></pre></li>
</ul>
<h3 id="Property-of-Wavelet-object"><a href="#Property-of-Wavelet-object" class="headerlink" title="Property of Wavelet object"></a>Property of Wavelet object</h3><p>name, filter_bank</p>
<h2 id="Signal-Extension-Modes"><a href="#Signal-Extension-Modes" class="headerlink" title="Signal Extension Modes"></a>Signal Extension Modes</h2><p>Because the most common and practical way of representing digital signals in computer science is with finite arrays of values, some extrapolation of the input data has to be performed in order to extend the signal before computing the Discrete Wavelet Transform using the cascading filter banks algorithm.</p>
<p>Depending on the extrapolation method, significant artifacts at the signal ’ s borders can be introduced during that process, which in turn may lead to inaccurate computations of the DWT at the signal ’ s ends.</p>
<p>PyWavelets provides several methods of signal extrapolation that can be used to minimize this negative effect:</p>
<ul>
<li>zpd - zero-padding - signal is extended by adding zero samples:<br><code>... 0  0 | x1 x2 ... xn | 0  0 ...</code></li>
<li>cpd - constant-padding - border values are replicated:<br><code>... x1 x1 | x1 x2 ... xn | xn xn ...</code></li>
<li>sym - symmetric-padding - signal is extended by mirroring samples:<br><code>... x2 x1 | x1 x2 ... xn | xn xn-1 ...</code></li>
<li>ppd - periodic-padding - signal is treated as a periodic one:<br><code>... xn-1 xn | x1 x2 ... xn | x1 x2 ...</code></li>
<li>sp1 - smooth-padding - signal is extended according to the first derivatives calculated on the edges (straight line)</li>
</ul>
<p>DWT performed for these extension modes is slightly redundant, but ensures perfect reconstruction. To receive the smallest possible number of coefficients, computations can be performed with the periodization mode:<br>per - periodization - is like periodic-padding but gives the smallest possible number of decomposition coefficients. IDWT must be performed with the same mode.</p>
<h2 id="Discrete-Wavelet-Transform-DWT"><a href="#Discrete-Wavelet-Transform-DWT" class="headerlink" title="Discrete Wavelet Transform (DWT)"></a>Discrete Wavelet Transform (DWT)</h2><p>Wavelet transform has recently become a very popular when it comes to analysis, de-noising and compression of signals and images. This section describes functions used to perform single- and multilevel Discrete Wavelet Transforms.</p>
<h3 id="Single-level-dwt"><a href="#Single-level-dwt" class="headerlink" title="Single level dwt"></a>Single level dwt</h3><p><code>pywt.dwt(data, wavelet[, mode=&#39;sym&#39;])</code><br>The dwt() function is used to perform single level, one dimensional Discrete Wavelet Transform.<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">(cA, cD) = dwt(data, wavelet, mode=&apos;sym&apos;)</div></pre></td></tr></table></figure></p>
<p>Parameters:<br>    data – Input signal can be NumPy array, Python list or other iterable object. Both single and double precision floating-point data types are supported and the output type depends on the input type. If the input data is not in one of these types it will be converted to the default double precision data format before performing computations.<br>    wavelet – Wavelet to use in the transform. This can be a name of the wavelet from the pywt.wavelist list or a Wavelet object instance.<br>    mode – Signal extension mode to deal with the border distortion problem. See MODES for details.<br>The transform coefficients are returned as two arrays containing approximation (cA) and detail (cD) coefficients respectively. Length of returned arrays depends on the selected signal extension mode - see the signal extension modes section for the list of available options and the dwt_coeff_len() function for information on getting the expected result length:</p>
<ul>
<li>for all modes except periodization:<br><code>len(cA) == len(cD) == floor((len(data) + wavelet.dec_len - 1) / 2)</code></li>
<li>for periodization mode (“per”):<br><code>len(cA) == len(cD) == ceil(len(data) / 2)</code></li>
</ul>
<h3 id="Multilevel-decomposition-using-wavedec"><a href="#Multilevel-decomposition-using-wavedec" class="headerlink" title="Multilevel decomposition using wavedec"></a>Multilevel decomposition using wavedec</h3><ul>
<li>pywt.wavedec(data, wavelet, mode=’sym’, level=None)<br>The wavedec() function performs 1D multilevel Discrete Wavelet Transform decomposition of given signal and returns ordered list of coefficients arrays in the form:<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[cA_n, cD_n, cD_n-1, ..., cD2, cD1],</div></pre></td></tr></table></figure>
</li>
</ul>
<p>where n denotes the level of decomposition. The first element (cA_n) of the result is approximation coefficients array and the following elements (cD_n - cD_1) are details coefficients arrays.</p>
<p>Parameters:</p>
<ul>
<li>data – Input signal can be NumPy array, Python list or other iterable object. Both single and double precision floating-point data types are supported and the output type depends on the input type. If the input data is not in one of these types it will be converted to the default double precision data format before performing computations.</li>
<li>wavelet – Wavelet to use in the transform. This can be a name of the wavelet from the pywt.wavelist list or a Wavelet object instance.</li>
<li>mode – Signal extension mode to deal with the border distortion problem. See MODES for details.</li>
<li>level – Number of decomposition steps to performe. If the level is None, then the full decomposition up to the level computed with dwt_max_level() function for the given data and wavelet lengths is performed.</li>
</ul>
<h2 id="Inverse-Discrete-Wavelet-Transform-IDWT"><a href="#Inverse-Discrete-Wavelet-Transform-IDWT" class="headerlink" title="Inverse Discrete Wavelet Transform (IDWT)"></a>Inverse Discrete Wavelet Transform (IDWT)</h2><h3 id="Single-level-idwt"><a href="#Single-level-idwt" class="headerlink" title="Single level idwt"></a>Single level idwt</h3><p><code>pywt.idwt(cA, cD, wavelet[, mode=&#39;sym&#39;[, correct_size=0]])</code><br>The idwt() function reconstructs data from the given coefficients by performing single level Inverse Discrete Wavelet Transform.<br>Parameters:</p>
<ul>
<li>cA – Approximation coefficients.</li>
<li>cD – Detail coefficients.</li>
<li>wavelet – Wavelet to use in the transform. This can be a name of the wavelet from the pywt.wavelist list or a Wavelet object instance.</li>
<li>mode – Signal extension mode to deal with the border distortion problem. See MODES for details. This is only important when DWT was performed in periodization mode.</li>
<li>correct_size – Typically, cA and cD coefficients lists must have equal lengths in order to perform IDWT. Setting correct_size to True allows cA to be greater in size by one element compared to the cD size. This option is very useful when doing multilevel decomposition and reconstruction (as for example with the wavedec() function) of non-dyadic length signals when such minor differences can occur at various levels of IDWT.</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">&gt;&gt;&gt; import pywt</div><div class="line">&gt;&gt;&gt; (cA, cD) = pywt.dwt([1,2,3,4,5,6], &apos;db2&apos;, &apos;sp1&apos;)</div><div class="line">&gt;&gt;&gt; print pywt.idwt(cA, cD, &apos;db2&apos;, &apos;sp1&apos;)</div><div class="line">[ 1.  2.  3.  4.  5.  6.]</div></pre></td></tr></table></figure>
<p>One of the neat features of idwt() is that one of the cA and cD arguments can be set to None. In that situation the reconstruction will be performed using only the other one. Mathematically speaking, this is equivalent to passing a zero-filled array as one of the arguments.</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">&gt;&gt;&gt; import pywt</div><div class="line">&gt;&gt;&gt; (cA, cD) = pywt.dwt([1,2,3,4,5,6], &apos;db2&apos;, &apos;sp1&apos;)</div><div class="line">&gt;&gt;&gt; A = pywt.idwt(cA, None, &apos;db2&apos;, &apos;sp1&apos;)</div><div class="line">&gt;&gt;&gt; D = pywt.idwt(None, cD, &apos;db2&apos;, &apos;sp1&apos;)</div><div class="line">&gt;&gt;&gt; print A + D</div><div class="line">[ 1.  2.  3.  4.  5.  6.]</div></pre></td></tr></table></figure>
<h3 id="Multilevel-reconstruction-using-waverec"><a href="#Multilevel-reconstruction-using-waverec" class="headerlink" title="Multilevel reconstruction using waverec"></a>Multilevel reconstruction using waverec</h3><p><code>pywt.waverec(coeffs, wavelet[, mode=&#39;sym&#39;])</code><br>Performs multilevel reconstruction of signal from the given list of coefficients.<br>Parameters:</p>
<pre><code>- coeffs –
    Coefficients list must be in the form like returned by wavedec() decomposition function, which is:
    [cAn, cDn, cDn-1, ..., cD2, cD1]
- wavelet – Wavelet to use in the transform. This can be a name of the wavelet from the pywt.wavelist list or a Wavelet object instance.
- mode – Signal extension mode to deal with the border distortion problem. See MODES for details.
</code></pre><h2 id="Usage-examples"><a href="#Usage-examples" class="headerlink" title="Usage examples"></a>Usage examples</h2><p><a href="https://pywavelets.readthedocs.io/en/0.2.0/regression/index.html" target="_blank" rel="external">https://pywavelets.readthedocs.io/en/0.2.0/regression/index.html</a></p>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2018/02/27/Filter-Design-in-SciPy/" rel="next" title="Filter Design in SciPy">
                <i class="fa fa-chevron-left"></i> Filter Design in SciPy
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2018/03/01/QiuTuJianShen/" rel="prev" title="QiuTuJianShen">
                QiuTuJianShen <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          
  <div class="comments" id="comments">
    
  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/uploads/avatar.jpg"
               alt="东木金" />
          <p class="site-author-name" itemprop="name">东木金</p>
           
              <p class="site-description motion-element" itemprop="description">正在学习机器学习，希望能变得很强！</p>
          
        </div>
        <nav class="site-state motion-element">

          
            <div class="site-state-item site-state-posts">
              <a href="/archives/">
                <span class="site-state-item-count">162</span>
                <span class="site-state-item-name">日志</span>
              </a>
            </div>
          

          
            
            
            <div class="site-state-item site-state-categories">
              <a href="/categories/index.html">
                <span class="site-state-item-count">18</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            
            
            <div class="site-state-item site-state-tags">
              <a href="/tags/index.html">
                <span class="site-state-item-count">42</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
            
              <span class="links-of-author-item">
                <a href="https://github.com/bdmk" target="_blank" title="GitHub">
                  
                    <i class="fa fa-fw fa-github"></i>
                  
                    
                      GitHub
                    
                </a>
              </span>
            
              <span class="links-of-author-item">
                <a href="mailto:catcherchan94@outlook.com" target="_blank" title="E-Mail">
                  
                    <i class="fa fa-fw fa-envelope"></i>
                  
                    
                      E-Mail
                    
                </a>
              </span>
            
          
        </div>

        
        

        
        

        


      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#Wavelet-Families-and-Built-in-wavelets"><span class="nav-number">1.</span> <span class="nav-text">Wavelet Families and Built-in wavelets</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Wavelet-object"><span class="nav-number">2.</span> <span class="nav-text">Wavelet object</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Property-of-Wavelet-object"><span class="nav-number">2.1.</span> <span class="nav-text">Property of Wavelet object</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Signal-Extension-Modes"><span class="nav-number">3.</span> <span class="nav-text">Signal Extension Modes</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Discrete-Wavelet-Transform-DWT"><span class="nav-number">4.</span> <span class="nav-text">Discrete Wavelet Transform (DWT)</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Single-level-dwt"><span class="nav-number">4.1.</span> <span class="nav-text">Single level dwt</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Multilevel-decomposition-using-wavedec"><span class="nav-number">4.2.</span> <span class="nav-text">Multilevel decomposition using wavedec</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Inverse-Discrete-Wavelet-Transform-IDWT"><span class="nav-number">5.</span> <span class="nav-text">Inverse Discrete Wavelet Transform (IDWT)</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Single-level-idwt"><span class="nav-number">5.1.</span> <span class="nav-text">Single level idwt</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Multilevel-reconstruction-using-waverec"><span class="nav-number">5.2.</span> <span class="nav-text">Multilevel reconstruction using waverec</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Usage-examples"><span class="nav-number">6.</span> <span class="nav-text">Usage examples</span></a></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy;  2017 - 
  <span itemprop="copyrightYear">2018</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">东木金</span>
</div>


<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Gemini
  </a>
</div>


        

        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.2"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.2"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=5.1.2"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.2"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.2"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.2"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.2"></script>



  


  




	





  





  






  

  <script type="text/javascript">
    // Popup Window;
    var isfetched = false;
    var isXml = true;
    // Search DB path;
    var search_path = "search.xml";
    if (search_path.length === 0) {
      search_path = "search.xml";
    } else if (/json$/i.test(search_path)) {
      isXml = false;
    }
    var path = "/" + search_path;
    // monitor main search box;

    var onPopupClose = function (e) {
      $('.popup').hide();
      $('#local-search-input').val('');
      $('.search-result-list').remove();
      $('#no-result').remove();
      $(".local-search-pop-overlay").remove();
      $('body').css('overflow', '');
    }

    function proceedsearch() {
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
        .css('overflow', 'hidden');
      $('.search-popup-overlay').click(onPopupClose);
      $('.popup').toggle();
      var $localSearchInput = $('#local-search-input');
      $localSearchInput.attr("autocapitalize", "none");
      $localSearchInput.attr("autocorrect", "off");
      $localSearchInput.focus();
    }

    // search function;
    var searchFunc = function(path, search_id, content_id) {
      'use strict';

      // start loading animation
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay">' +
          '<div id="search-loading-icon">' +
          '<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
          '</div>' +
          '</div>')
        .css('overflow', 'hidden');
      $("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');

      $.ajax({
        url: path,
        dataType: isXml ? "xml" : "json",
        async: true,
        success: function(res) {
          // get the contents from search data
          isfetched = true;
          $('.popup').detach().appendTo('.header-inner');
          var datas = isXml ? $("entry", res).map(function() {
            return {
              title: $("title", this).text(),
              content: $("content",this).text(),
              url: $("url" , this).text()
            };
          }).get() : res;
          var input = document.getElementById(search_id);
          var resultContent = document.getElementById(content_id);
          var inputEventFunction = function() {
            var searchText = input.value.trim().toLowerCase();
            var keywords = searchText.split(/[\s\-]+/);
            if (keywords.length > 1) {
              keywords.push(searchText);
            }
            var resultItems = [];
            if (searchText.length > 0) {
              // perform local searching
              datas.forEach(function(data) {
                var isMatch = false;
                var hitCount = 0;
                var searchTextCount = 0;
                var title = data.title.trim();
                var titleInLowerCase = title.toLowerCase();
                var content = data.content.trim().replace(/<[^>]+>/g,"");
                var contentInLowerCase = content.toLowerCase();
                var articleUrl = decodeURIComponent(data.url);
                var indexOfTitle = [];
                var indexOfContent = [];
                // only match articles with not empty titles
                if(title != '') {
                  keywords.forEach(function(keyword) {
                    function getIndexByWord(word, text, caseSensitive) {
                      var wordLen = word.length;
                      if (wordLen === 0) {
                        return [];
                      }
                      var startPosition = 0, position = [], index = [];
                      if (!caseSensitive) {
                        text = text.toLowerCase();
                        word = word.toLowerCase();
                      }
                      while ((position = text.indexOf(word, startPosition)) > -1) {
                        index.push({position: position, word: word});
                        startPosition = position + wordLen;
                      }
                      return index;
                    }

                    indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
                    indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
                  });
                  if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
                    isMatch = true;
                    hitCount = indexOfTitle.length + indexOfContent.length;
                  }
                }

                // show search results

                if (isMatch) {
                  // sort index by position of keyword

                  [indexOfTitle, indexOfContent].forEach(function (index) {
                    index.sort(function (itemLeft, itemRight) {
                      if (itemRight.position !== itemLeft.position) {
                        return itemRight.position - itemLeft.position;
                      } else {
                        return itemLeft.word.length - itemRight.word.length;
                      }
                    });
                  });

                  // merge hits into slices

                  function mergeIntoSlice(text, start, end, index) {
                    var item = index[index.length - 1];
                    var position = item.position;
                    var word = item.word;
                    var hits = [];
                    var searchTextCountInSlice = 0;
                    while (position + word.length <= end && index.length != 0) {
                      if (word === searchText) {
                        searchTextCountInSlice++;
                      }
                      hits.push({position: position, length: word.length});
                      var wordEnd = position + word.length;

                      // move to next position of hit

                      index.pop();
                      while (index.length != 0) {
                        item = index[index.length - 1];
                        position = item.position;
                        word = item.word;
                        if (wordEnd > position) {
                          index.pop();
                        } else {
                          break;
                        }
                      }
                    }
                    searchTextCount += searchTextCountInSlice;
                    return {
                      hits: hits,
                      start: start,
                      end: end,
                      searchTextCount: searchTextCountInSlice
                    };
                  }

                  var slicesOfTitle = [];
                  if (indexOfTitle.length != 0) {
                    slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
                  }

                  var slicesOfContent = [];
                  while (indexOfContent.length != 0) {
                    var item = indexOfContent[indexOfContent.length - 1];
                    var position = item.position;
                    var word = item.word;
                    // cut out 100 characters
                    var start = position - 20;
                    var end = position + 80;
                    if(start < 0){
                      start = 0;
                    }
                    if (end < position + word.length) {
                      end = position + word.length;
                    }
                    if(end > content.length){
                      end = content.length;
                    }
                    slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
                  }

                  // sort slices in content by search text's count and hits' count

                  slicesOfContent.sort(function (sliceLeft, sliceRight) {
                    if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
                      return sliceRight.searchTextCount - sliceLeft.searchTextCount;
                    } else if (sliceLeft.hits.length !== sliceRight.hits.length) {
                      return sliceRight.hits.length - sliceLeft.hits.length;
                    } else {
                      return sliceLeft.start - sliceRight.start;
                    }
                  });

                  // select top N slices in content

                  var upperBound = parseInt('1');
                  if (upperBound >= 0) {
                    slicesOfContent = slicesOfContent.slice(0, upperBound);
                  }

                  // highlight title and content

                  function highlightKeyword(text, slice) {
                    var result = '';
                    var prevEnd = slice.start;
                    slice.hits.forEach(function (hit) {
                      result += text.substring(prevEnd, hit.position);
                      var end = hit.position + hit.length;
                      result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
                      prevEnd = end;
                    });
                    result += text.substring(prevEnd, slice.end);
                    return result;
                  }

                  var resultItem = '';

                  if (slicesOfTitle.length != 0) {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
                  } else {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
                  }

                  slicesOfContent.forEach(function (slice) {
                    resultItem += "<a href='" + articleUrl + "'>" +
                      "<p class=\"search-result\">" + highlightKeyword(content, slice) +
                      "...</p>" + "</a>";
                  });

                  resultItem += "</li>";
                  resultItems.push({
                    item: resultItem,
                    searchTextCount: searchTextCount,
                    hitCount: hitCount,
                    id: resultItems.length
                  });
                }
              })
            };
            if (keywords.length === 1 && keywords[0] === "") {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
            } else if (resultItems.length === 0) {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
            } else {
              resultItems.sort(function (resultLeft, resultRight) {
                if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
                  return resultRight.searchTextCount - resultLeft.searchTextCount;
                } else if (resultLeft.hitCount !== resultRight.hitCount) {
                  return resultRight.hitCount - resultLeft.hitCount;
                } else {
                  return resultRight.id - resultLeft.id;
                }
              });
              var searchResultList = '<ul class=\"search-result-list\">';
              resultItems.forEach(function (result) {
                searchResultList += result.item;
              })
              searchResultList += "</ul>";
              resultContent.innerHTML = searchResultList;
            }
          }

          if ('auto' === 'manual') {
            input.addEventListener('input', inputEventFunction);
          } else {
            $('.search-icon').click(inputEventFunction);
            input.addEventListener('keypress', function (event) {
              if (event.keyCode === 13) {
                inputEventFunction();
              }
            });
          }

          // remove loading animation
          $(".local-search-pop-overlay").remove();
          $('body').css('overflow', '');

          proceedsearch();
        }
      });
    }

    // handle and trigger popup window;
    $('.popup-trigger').click(function(e) {
      e.stopPropagation();
      if (isfetched === false) {
        searchFunc(path, 'local-search-input', 'local-search-result');
      } else {
        proceedsearch();
      };
    });

    $('.popup-btn-close').click(onPopupClose);
    $('.popup').click(function(e){
      e.stopPropagation();
    });
    $(document).on('keyup', function (event) {
      var shouldDismissSearchPopup = event.which === 27 &&
        $('.search-popup').is(':visible');
      if (shouldDismissSearchPopup) {
        onPopupClose();
      }
    });
  </script>





  

  

  

  
  
    <script type="text/x-mathjax-config">
      MathJax.Hub.Config({
        tex2jax: {
          inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
          processEscapes: true,
          skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
        }
      });
    </script>

    <script type="text/x-mathjax-config">
      MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for (i=0; i < all.length; i += 1) {
          all[i].SourceElement().parentNode.className += ' has-jax';
        }
      });
    </script>
    <script type="text/javascript" src="//cdn.bootcss.com/mathjax/2.7.1/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
  


  

  

</body>
</html>
